In [1]:
!head -n 10 babynames/yob1994.txt












In [2]:
import pandas as pd

In [3]:
names1994 = pd.read_csv('babynames/yob1994.txt', names=['name', 'sex', 'births'])

In [4]:
names1994


Out[4]:
name sex births
0 Jessica F 32117
1 Ashley F 30278
2 Emily F 24148
3 Samantha F 22817
4 Sarah F 22281
5 Taylor F 20731
6 Brittany F 18899
7 Amanda F 18715
8 Elizabeth F 16778
9 Megan F 16578
10 Nicole F 16011
11 Kayla F 15885
12 Rachel F 15484
13 Lauren F 15153
14 Stephanie F 14749
15 Hannah F 14494
16 Jennifer F 13997
17 Alexis F 13035
18 Victoria F 12690
19 Danielle F 12448
20 Amber F 12345
21 Courtney F 12019
22 Jasmine F 11711
23 Rebecca F 11278
24 Morgan F 10656
25 Alyssa F 10602
26 Brianna F 10517
27 Alexandra F 10226
28 Kelsey F 9752
29 Katherine F 9585
... ... ... ...
25968 Yogi M 5
25969 Yohanan M 5
25970 Yomar M 5
25971 Yordan M 5
25972 Yordy M 5
25973 Yoshihiro M 5
25974 You M 5
25975 Yutaro M 5
25976 Yuval M 5
25977 Yuya M 5
25978 Yvette M 5
25979 Zabdiel M 5
25980 Zacaria M 5
25981 Zacharay M 5
25982 Zacherey M 5
25983 Zackari M 5
25984 Zacory M 5
25985 Zahn M 5
25986 Zakaree M 5
25987 Zakarie M 5
25988 Zakhary M 5
25989 Zakory M 5
25990 Zaron M 5
25991 Zaven M 5
25992 Zavius M 5
25993 Zedric M 5
25994 Zef M 5
25995 Zoey M 5
25996 Zong M 5
25997 Zuhair M 5

25998 rows × 3 columns


In [14]:
years = range(1880, 2015)

In [15]:
pieces = []

In [16]:
columns = ['name', 'sex', 'births']

In [21]:
for year in years:
    path = 'babynames/yob%d.txt' % year
    frame = pd.read_csv(path, names=columns)
    
    frame['year'] = year
    pieces.append(frame)

In [22]:
names = pd.concat(pieces, ignore_index=True)

In [23]:
names


Out[23]:
name sex births year
0 Emma F 20886 2014
1 Olivia F 19761 2014
2 Sophia F 18563 2014
3 Isabella F 17027 2014
4 Ava F 15660 2014
5 Mia F 13484 2014
6 Emily F 12622 2014
7 Abigail F 12049 2014
8 Madison F 10291 2014
9 Charlotte F 10094 2014
10 Harper F 9601 2014
11 Sofia F 9576 2014
12 Avery F 9552 2014
13 Elizabeth F 9537 2014
14 Amelia F 8770 2014
15 Evelyn F 8734 2014
16 Ella F 8525 2014
17 Chloe F 8507 2014
18 Victoria F 7981 2014
19 Aubrey F 7616 2014
20 Grace F 7602 2014
21 Zoey F 7384 2014
22 Natalie F 7089 2014
23 Addison F 6974 2014
24 Lillian F 6898 2014
25 Brooklyn F 6791 2014
26 Lily F 6760 2014
27 Hannah F 6551 2014
28 Layla F 6442 2014
29 Scarlett F 5994 2014
... ... ... ... ...
1858883 Zeid M 5 2014
1858884 Zeidan M 5 2014
1858885 Zekeriah M 5 2014
1858886 Zenas M 5 2014
1858887 Zephen M 5 2014
1858888 Zerick M 5 2014
1858889 Zhaiden M 5 2014
1858890 Zhalen M 5 2014
1858891 Zhayden M 5 2014
1858892 Ziar M 5 2014
1858893 Zichen M 5 2014
1858894 Ziden M 5 2014
1858895 Zierre M 5 2014
1858896 Ziion M 5 2014
1858897 Zijun M 5 2014
1858898 Zilas M 5 2014
1858899 Zirui M 5 2014
1858900 Zivon M 5 2014
1858901 Ziyah M 5 2014
1858902 Ziyang M 5 2014
1858903 Zmarion M 5 2014
1858904 Zo M 5 2014
1858905 Zoraiz M 5 2014
1858906 Zyeir M 5 2014
1858907 Zyel M 5 2014
1858908 Zykeem M 5 2014
1858909 Zymeer M 5 2014
1858910 Zymiere M 5 2014
1858911 Zyran M 5 2014
1858912 Zyrin M 5 2014

1858913 rows × 4 columns


In [25]:
total_births = names.pivot_table('births', index='year', columns='sex', aggfunc=sum)

In [26]:
total_births.tail()


Out[26]:
sex F M
year
2010 1773440 1914629
2011 1754424 1894262
2012 1755254 1890889
2013 1747544 1883945
2014 3554484 3821752

In [27]:
def add_prop(group):
    births = group.births.astype(float)
    
    group['prop'] = births / births.sum()
    return group

In [28]:
names = names.groupby(['year', 'sex']).apply(add_prop)

In [29]:
names


Out[29]:
name sex births year prop
0 Emma F 20886 2014 0.005876
1 Olivia F 19761 2014 0.005559
2 Sophia F 18563 2014 0.005222
3 Isabella F 17027 2014 0.004790
4 Ava F 15660 2014 0.004406
5 Mia F 13484 2014 0.003794
6 Emily F 12622 2014 0.003551
7 Abigail F 12049 2014 0.003390
8 Madison F 10291 2014 0.002895
9 Charlotte F 10094 2014 0.002840
10 Harper F 9601 2014 0.002701
11 Sofia F 9576 2014 0.002694
12 Avery F 9552 2014 0.002687
13 Elizabeth F 9537 2014 0.002683
14 Amelia F 8770 2014 0.002467
15 Evelyn F 8734 2014 0.002457
16 Ella F 8525 2014 0.002398
17 Chloe F 8507 2014 0.002393
18 Victoria F 7981 2014 0.002245
19 Aubrey F 7616 2014 0.002143
20 Grace F 7602 2014 0.002139
21 Zoey F 7384 2014 0.002077
22 Natalie F 7089 2014 0.001994
23 Addison F 6974 2014 0.001962
24 Lillian F 6898 2014 0.001941
25 Brooklyn F 6791 2014 0.001911
26 Lily F 6760 2014 0.001902
27 Hannah F 6551 2014 0.001843
28 Layla F 6442 2014 0.001812
29 Scarlett F 5994 2014 0.001686
... ... ... ... ... ...
1858883 Zeid M 5 2014 0.000001
1858884 Zeidan M 5 2014 0.000001
1858885 Zekeriah M 5 2014 0.000001
1858886 Zenas M 5 2014 0.000001
1858887 Zephen M 5 2014 0.000001
1858888 Zerick M 5 2014 0.000001
1858889 Zhaiden M 5 2014 0.000001
1858890 Zhalen M 5 2014 0.000001
1858891 Zhayden M 5 2014 0.000001
1858892 Ziar M 5 2014 0.000001
1858893 Zichen M 5 2014 0.000001
1858894 Ziden M 5 2014 0.000001
1858895 Zierre M 5 2014 0.000001
1858896 Ziion M 5 2014 0.000001
1858897 Zijun M 5 2014 0.000001
1858898 Zilas M 5 2014 0.000001
1858899 Zirui M 5 2014 0.000001
1858900 Zivon M 5 2014 0.000001
1858901 Ziyah M 5 2014 0.000001
1858902 Ziyang M 5 2014 0.000001
1858903 Zmarion M 5 2014 0.000001
1858904 Zo M 5 2014 0.000001
1858905 Zoraiz M 5 2014 0.000001
1858906 Zyeir M 5 2014 0.000001
1858907 Zyel M 5 2014 0.000001
1858908 Zykeem M 5 2014 0.000001
1858909 Zymeer M 5 2014 0.000001
1858910 Zymiere M 5 2014 0.000001
1858911 Zyran M 5 2014 0.000001
1858912 Zyrin M 5 2014 0.000001

1858913 rows × 5 columns


In [31]:
import numpy as np

In [32]:
np.allclose(names.groupby(['year', 'sex']).prop.sum(), 1)


Out[32]:
True

In [36]:
def get_top1000(group):
    return group.sort_values(by='births', ascending=False)[:1000]

In [37]:
grouped = names.groupby(['year', 'sex'])

In [38]:
top1000 = grouped.apply(get_top1000)

In [39]:
top1000


Out[39]:
name sex births year prop
year sex
1880 F 33176 Mary F 7065 1880 0.077644
33177 Anna F 2604 1880 0.028618
33178 Emma F 2003 1880 0.022013
33179 Elizabeth F 1939 1880 0.021310
33180 Minnie F 1746 1880 0.019189
33181 Margaret F 1578 1880 0.017342
33182 Ida F 1472 1880 0.016177
33183 Alice F 1414 1880 0.015540
33184 Bertha F 1320 1880 0.014507
33185 Sarah F 1288 1880 0.014155
33186 Annie F 1258 1880 0.013825
33187 Clara F 1226 1880 0.013474
33188 Ella F 1156 1880 0.012704
33189 Florence F 1063 1880 0.011682
33190 Cora F 1045 1880 0.011485
33191 Martha F 1040 1880 0.011430
33192 Laura F 1012 1880 0.011122
33193 Nellie F 995 1880 0.010935
33194 Grace F 982 1880 0.010792
33195 Carrie F 949 1880 0.010429
33196 Maude F 858 1880 0.009429
33197 Mabel F 808 1880 0.008880
33198 Bessie F 796 1880 0.008748
33199 Jennie F 793 1880 0.008715
33200 Gertrude F 787 1880 0.008649
33201 Julia F 783 1880 0.008605
33202 Hattie F 769 1880 0.008451
33203 Edith F 768 1880 0.008440
33204 Mattie F 704 1880 0.007737
33205 Rose F 700 1880 0.007693
... ... ... ... ... ... ... ...
2014 M 19635 Lawson M 576 2014 0.000151
1845372 Lawson M 576 2014 0.000151
19636 Rodrigo M 575 2014 0.000150
1845373 Rodrigo M 575 2014 0.000150
19638 Harvey M 574 2014 0.000150
19637 Beckham M 574 2014 0.000150
1845374 Beckham M 574 2014 0.000150
1845375 Harvey M 574 2014 0.000150
19639 Dennis M 573 2014 0.000150
1845376 Dennis M 573 2014 0.000150
19640 Uriel M 573 2014 0.000150
1845377 Uriel M 573 2014 0.000150
1845378 Armani M 570 2014 0.000149
19641 Armani M 570 2014 0.000149
1845379 Marvin M 568 2014 0.000149
19642 Marvin M 568 2014 0.000149
1845380 Frederick M 566 2014 0.000148
19643 Frederick M 566 2014 0.000148
1845381 Kian M 566 2014 0.000148
19644 Kian M 566 2014 0.000148
19645 Darren M 565 2014 0.000148
19646 Mohammed M 565 2014 0.000148
19647 Raylan M 565 2014 0.000148
1845384 Raylan M 565 2014 0.000148
1845382 Darren M 565 2014 0.000148
1845383 Mohammed M 565 2014 0.000148
1845385 Trent M 563 2014 0.000147
19648 Trent M 563 2014 0.000147
19649 Callen M 561 2014 0.000147
1845386 Callen M 561 2014 0.000147

269877 rows × 5 columns


In [40]:
boys = top1000[top1000.sex == 'M']

In [41]:
girls = top1000[top1000.sex == 'F']

In [42]:
total_births = top1000.pivot_table('births', index='year', columns='name', aggfunc=sum)

In [43]:
total_births


Out[43]:
name Aaden Aaliyah Aarav Aaron Aarush Ab Abagail Abb Abbey Abbie ... Zoa Zoe Zoey Zoie Zola Zollie Zona Zora Zula Zuri
year
1880 NaN NaN NaN 102.0 NaN NaN NaN NaN NaN 71.0 ... 8.0 23.0 NaN NaN 7.0 NaN 8.0 28.0 27.0 NaN
1881 NaN NaN NaN 94.0 NaN NaN NaN NaN NaN 81.0 ... NaN 22.0 NaN NaN 10.0 NaN 9.0 21.0 27.0 NaN
1882 NaN NaN NaN 85.0 NaN NaN NaN NaN NaN 80.0 ... 8.0 25.0 NaN NaN 9.0 NaN 17.0 32.0 21.0 NaN
1883 NaN NaN NaN 105.0 NaN NaN NaN NaN NaN 79.0 ... NaN 23.0 NaN NaN 10.0 NaN 11.0 35.0 25.0 NaN
1884 NaN NaN NaN 97.0 NaN NaN NaN NaN NaN 98.0 ... 13.0 31.0 NaN NaN 14.0 6.0 8.0 58.0 27.0 NaN
1885 NaN NaN NaN 88.0 NaN 6.0 NaN NaN NaN 88.0 ... 6.0 27.0 NaN NaN 12.0 6.0 14.0 48.0 38.0 NaN
1886 NaN NaN NaN 86.0 NaN NaN NaN NaN NaN 84.0 ... 13.0 25.0 NaN NaN 8.0 NaN 20.0 52.0 43.0 NaN
1887 NaN NaN NaN 78.0 NaN NaN NaN NaN NaN 104.0 ... 9.0 34.0 NaN NaN 23.0 NaN 28.0 46.0 33.0 NaN
1888 NaN NaN NaN 90.0 NaN NaN NaN NaN NaN 137.0 ... 11.0 42.0 NaN NaN 23.0 7.0 30.0 42.0 45.0 NaN
1889 NaN NaN NaN 85.0 NaN NaN NaN NaN NaN 107.0 ... 14.0 29.0 NaN NaN 22.0 NaN 29.0 53.0 55.0 NaN
1890 NaN NaN NaN 96.0 NaN NaN NaN 6.0 NaN 140.0 ... NaN 42.0 NaN NaN 32.0 7.0 27.0 60.0 65.0 NaN
1891 NaN NaN NaN 69.0 NaN NaN NaN NaN NaN 124.0 ... NaN 34.0 NaN NaN 29.0 6.0 14.0 52.0 45.0 NaN
1892 NaN NaN NaN 95.0 NaN NaN NaN NaN NaN 119.0 ... NaN 34.0 NaN NaN 27.0 NaN 25.0 66.0 53.0 NaN
1893 NaN NaN NaN 81.0 NaN NaN NaN NaN NaN 115.0 ... NaN 23.0 NaN NaN 34.0 6.0 15.0 67.0 70.0 NaN
1894 NaN NaN NaN 79.0 NaN NaN NaN NaN NaN 118.0 ... NaN 28.0 NaN NaN 51.0 NaN 23.0 66.0 64.0 NaN
1895 NaN NaN NaN 94.0 NaN NaN NaN NaN NaN 92.0 ... NaN 34.0 NaN NaN 60.0 11.0 38.0 55.0 55.0 NaN
1896 NaN NaN NaN 69.0 NaN NaN NaN NaN NaN 121.0 ... NaN 36.0 NaN NaN 47.0 NaN 38.0 72.0 65.0 NaN
1897 NaN NaN NaN 87.0 NaN NaN NaN NaN NaN 97.0 ... NaN 35.0 NaN NaN 51.0 NaN 28.0 67.0 79.0 NaN
1898 NaN NaN NaN 89.0 NaN NaN NaN NaN NaN 120.0 ... NaN 30.0 NaN NaN 62.0 NaN 28.0 65.0 83.0 NaN
1899 NaN NaN NaN 71.0 NaN NaN NaN NaN NaN 87.0 ... NaN 27.0 NaN NaN 49.0 6.0 31.0 56.0 60.0 NaN
1900 NaN NaN NaN 103.0 NaN NaN NaN NaN NaN 112.0 ... NaN 26.0 NaN NaN 48.0 9.0 44.0 99.0 71.0 NaN
1901 NaN NaN NaN 80.0 NaN NaN NaN NaN NaN 87.0 ... NaN 26.0 NaN NaN 56.0 NaN 31.0 58.0 57.0 NaN
1902 NaN NaN NaN 78.0 NaN NaN NaN NaN NaN 91.0 ... NaN 34.0 NaN NaN 58.0 NaN 23.0 58.0 66.0 NaN
1903 NaN NaN NaN 93.0 NaN NaN NaN NaN NaN 91.0 ... NaN 19.0 NaN NaN 64.0 NaN 41.0 83.0 74.0 NaN
1904 NaN NaN NaN 117.0 NaN NaN NaN NaN NaN 80.0 ... NaN 27.0 NaN NaN 46.0 NaN 35.0 54.0 74.0 NaN
1905 NaN NaN NaN 96.0 NaN NaN NaN NaN NaN 73.0 ... NaN 24.0 NaN NaN 66.0 8.0 24.0 55.0 61.0 NaN
1906 NaN NaN NaN 96.0 NaN NaN NaN NaN NaN 72.0 ... NaN 19.0 NaN NaN 59.0 NaN 37.0 64.0 58.0 NaN
1907 NaN NaN NaN 130.0 NaN NaN NaN NaN NaN 79.0 ... NaN 19.0 NaN NaN 53.0 11.0 39.0 92.0 72.0 NaN
1908 NaN NaN NaN 114.0 NaN NaN NaN NaN NaN 84.0 ... NaN 23.0 NaN NaN 70.0 NaN 31.0 59.0 53.0 NaN
1909 NaN NaN NaN 142.0 NaN NaN NaN NaN NaN 57.0 ... NaN 22.0 NaN NaN 59.0 NaN 39.0 57.0 76.0 NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1985 NaN NaN NaN 13134.0 NaN NaN NaN NaN 314.0 233.0 ... NaN 194.0 NaN NaN NaN NaN NaN NaN NaN NaN
1986 NaN NaN NaN 12690.0 NaN NaN NaN NaN 370.0 228.0 ... NaN 213.0 NaN NaN NaN NaN NaN NaN NaN NaN
1987 NaN NaN NaN 12678.0 NaN NaN NaN NaN 327.0 228.0 ... NaN 247.0 NaN NaN NaN NaN NaN NaN NaN NaN
1988 NaN NaN NaN 14397.0 NaN NaN NaN NaN 404.0 226.0 ... NaN 241.0 NaN NaN NaN NaN NaN NaN NaN NaN
1989 NaN NaN NaN 15314.0 NaN NaN NaN NaN 470.0 265.0 ... NaN 376.0 NaN NaN NaN NaN NaN NaN NaN NaN
1990 NaN NaN NaN 14550.0 NaN NaN NaN NaN 507.0 313.0 ... NaN 478.0 NaN NaN NaN NaN NaN NaN NaN NaN
1991 NaN NaN NaN 14240.0 NaN NaN NaN NaN 451.0 276.0 ... NaN 722.0 NaN NaN NaN NaN NaN NaN NaN NaN
1992 NaN NaN NaN 14506.0 NaN NaN NaN NaN 430.0 260.0 ... NaN 981.0 NaN NaN NaN NaN NaN NaN NaN NaN
1993 NaN NaN NaN 13825.0 NaN NaN NaN NaN 503.0 292.0 ... NaN 1193.0 NaN NaN NaN NaN NaN NaN NaN NaN
1994 NaN 1451.0 NaN 14380.0 NaN NaN NaN NaN 597.0 351.0 ... NaN 1333.0 NaN NaN NaN NaN NaN NaN NaN NaN
1995 NaN 1255.0 NaN 13286.0 NaN NaN NaN NaN 549.0 351.0 ... NaN 1726.0 219.0 NaN NaN NaN NaN NaN NaN NaN
1996 NaN 831.0 NaN 11969.0 NaN NaN NaN NaN 552.0 349.0 ... NaN 2064.0 339.0 NaN NaN NaN NaN NaN NaN NaN
1997 NaN 1738.0 NaN 11166.0 NaN NaN NaN NaN 645.0 386.0 ... NaN 2362.0 407.0 NaN NaN NaN NaN NaN NaN NaN
1998 NaN 1399.0 NaN 10544.0 NaN NaN NaN NaN 661.0 398.0 ... NaN 2692.0 478.0 225.0 NaN NaN NaN NaN NaN NaN
1999 NaN 1088.0 NaN 9852.0 NaN NaN 211.0 NaN 710.0 430.0 ... NaN 3237.0 563.0 257.0 NaN NaN NaN NaN NaN NaN
2000 NaN 1495.0 NaN 9551.0 NaN NaN 222.0 NaN 660.0 432.0 ... NaN 3785.0 691.0 320.0 NaN NaN NaN NaN NaN NaN
2001 NaN 3352.0 NaN 9534.0 NaN NaN 244.0 NaN 687.0 526.0 ... NaN 4644.0 822.0 439.0 NaN NaN NaN NaN NaN NaN
2002 NaN 4778.0 NaN 8999.0 NaN NaN 256.0 NaN 600.0 514.0 ... NaN 4884.0 1182.0 438.0 NaN NaN NaN NaN NaN NaN
2003 NaN 3671.0 NaN 8859.0 NaN NaN 276.0 NaN 625.0 536.0 ... NaN 5085.0 1469.0 449.0 NaN NaN NaN NaN NaN NaN
2004 NaN 3486.0 NaN 8386.0 NaN NaN 258.0 NaN 504.0 500.0 ... NaN 5362.0 1622.0 515.0 NaN NaN NaN NaN NaN NaN
2005 NaN 3456.0 NaN 7799.0 NaN NaN 287.0 NaN 452.0 445.0 ... NaN 4957.0 2270.0 502.0 NaN NaN NaN NaN NaN NaN
2006 NaN 3742.0 NaN 8291.0 NaN NaN 298.0 NaN 404.0 440.0 ... NaN 5152.0 2848.0 531.0 NaN NaN NaN NaN NaN NaN
2007 NaN 3952.0 NaN 8933.0 NaN NaN 313.0 NaN 349.0 468.0 ... NaN 4931.0 3031.0 527.0 NaN NaN NaN NaN NaN NaN
2008 956.0 4038.0 219.0 8536.0 NaN NaN 320.0 NaN 344.0 401.0 ... NaN 4779.0 3445.0 493.0 NaN NaN NaN NaN NaN NaN
2009 1267.0 4366.0 270.0 7966.0 NaN NaN 297.0 NaN 307.0 370.0 ... NaN 5144.0 3991.0 499.0 NaN NaN NaN NaN NaN NaN
2010 450.0 4659.0 438.0 7458.0 227.0 NaN 281.0 NaN 299.0 327.0 ... NaN 6263.0 5200.0 508.0 NaN NaN NaN NaN NaN 259.0
2011 274.0 5105.0 436.0 7610.0 NaN NaN NaN NaN 287.0 339.0 ... NaN 6294.0 6394.0 523.0 NaN NaN NaN NaN NaN 313.0
2012 223.0 5499.0 435.0 7519.0 NaN NaN NaN NaN NaN 342.0 ... NaN 6445.0 7457.0 516.0 NaN NaN NaN NaN NaN 434.0
2013 203.0 5217.0 495.0 7289.0 NaN NaN NaN NaN NaN NaN ... NaN 5967.0 7224.0 431.0 NaN NaN NaN NaN NaN 566.0
2014 NaN 9742.0 NaN 14736.0 NaN NaN NaN NaN NaN NaN ... NaN 11714.0 14768.0 NaN NaN NaN NaN NaN NaN 1328.0

135 rows × 6994 columns


In [48]:
%matplotlib notebook
import matplotlib
import matplotlib.pyplot as plt

In [54]:
subset = total_births[['Victor', 'Harry', 'Mary', 'Marilyn']]

In [52]:
subset.plot(subplots=True, figsize=(12, 10), grid=False, title="Number of births per year")


Out[52]:
array([<matplotlib.axes._subplots.AxesSubplot object at 0x7f08dacdf110>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x7f08aa4d3790>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x7f08aa4a9690>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x7f08aa3cd210>], dtype=object)

In [55]:
table = top1000.pivot_table('prop', index='year', columns='sex', aggfunc=sum)

In [57]:
table.plot(title='Sum of table1000.prop by year and sex', yticks=np.linspace(0, 1.2, 13), xticks=range(1880, 2020, 10))


Out[57]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f08aa1cef50>

In [58]:
df = boys[boys.year == 2010]

In [59]:
df


Out[59]:
name sex births year prop
year sex
2010 M 1710685 Jacob M 22095 2010 0.011540
1710686 Ethan M 17993 2010 0.009398
1710687 Michael M 17324 2010 0.009048
1710688 Jayden M 17158 2010 0.008962
1710689 William M 17036 2010 0.008898
1710690 Alexander M 16746 2010 0.008746
1710691 Noah M 16438 2010 0.008585
1710692 Daniel M 15819 2010 0.008262
1710693 Aiden M 15520 2010 0.008106
1710694 Anthony M 15475 2010 0.008083
1710695 Joshua M 15425 2010 0.008056
1710696 Mason M 14836 2010 0.007749
1710697 Christopher M 14259 2010 0.007447
1710698 Andrew M 14227 2010 0.007431
1710699 David M 14176 2010 0.007404
1710700 Matthew M 14114 2010 0.007372
1710701 Logan M 14014 2010 0.007319
1710702 Elijah M 13875 2010 0.007247
1710703 James M 13861 2010 0.007240
1710704 Joseph M 13806 2010 0.007211
1710705 Gabriel M 12859 2010 0.006716
1710706 Benjamin M 12421 2010 0.006487
1710707 Ryan M 11964 2010 0.006249
1710708 Samuel M 11948 2010 0.006240
1710709 Jackson M 11812 2010 0.006169
1710710 John M 11543 2010 0.006029
1710711 Nathan M 11367 2010 0.005937
1710712 Jonathan M 11113 2010 0.005804
1710713 Christian M 11084 2010 0.005789
1710714 Liam M 10924 2010 0.005706
... ... ... ... ... ...
... Ronaldo M 203 2010 0.000106
1711656 Yair M 203 2010 0.000106
1711657 Kael M 203 2010 0.000106
1711654 Gibson M 202 2010 0.000106
1711658 Keyon M 202 2010 0.000106
1711659 Reagan M 202 2010 0.000106
1711660 Kingsley M 201 2010 0.000105
1711661 Talan M 201 2010 0.000105
1711662 Yehuda M 201 2010 0.000105
1711663 Jordon M 200 2010 0.000104
1711667 Slade M 200 2010 0.000104
1711669 Sheldon M 200 2010 0.000104
1711668 Daylen M 200 2010 0.000104
1711666 Dashawn M 200 2010 0.000104
1711665 Cristofer M 200 2010 0.000104
1711664 Clarence M 199 2010 0.000104
1711670 Kadin M 199 2010 0.000104
1711671 Masen M 199 2010 0.000104
1711672 Rowen M 199 2010 0.000104
1711673 Clinton M 198 2010 0.000103
1711674 Dillan M 198 2010 0.000103
1711675 Thaddeus M 198 2010 0.000103
1711676 Yousef M 198 2010 0.000103
1711677 Truman M 197 2010 0.000103
1711678 Joziah M 196 2010 0.000102
1711683 Simeon M 196 2010 0.000102
1711686 Reuben M 196 2010 0.000102
1711685 Keshawn M 196 2010 0.000102
1711684 Destin M 196 2010 0.000102
1711680 Enoch M 196 2010 0.000102

1000 rows × 5 columns


In [60]:
prop_cumsum = df.sort_values(by='prop', ascending=False).prop.cumsum()

In [61]:
prop_cumsum[:10]


Out[61]:
year  sex         
2010  M    1710685    0.011540
           1710686    0.020938
           1710687    0.029986
           1710688    0.038947
           1710689    0.047845
           1710690    0.056592
           1710691    0.065177
           1710692    0.073439
           1710693    0.081545
           1710694    0.089628
Name: prop, dtype: float64

In [62]:
df = boys[boys.year == 1900]

In [64]:
in1900 = df.sort_values(by='prop', ascending=False).prop.cumsum()

In [65]:
in1900.searchsorted(0.5) + 1


Out[65]:
array([25])

In [68]:
def get_quantile_count(group, q=0.5):
    group = group.sort_values(by='prop', ascending=False)
    return group.prop.cumsum().searchsorted(q) + 1

In [69]:
diversity = top1000.groupby(['year', 'sex']).apply(get_quantile_count)

In [70]:
diversity = diversity.unstack('sex')

In [74]:
diversity


Out[74]:
sex F M
year
1880 [38] [14]
1881 [38] [14]
1882 [38] [15]
1883 [39] [15]
1884 [39] [16]
1885 [40] [16]
1886 [41] [16]
1887 [41] [17]
1888 [42] [17]
1889 [43] [18]
1890 [44] [19]
1891 [44] [20]
1892 [44] [20]
1893 [44] [21]
1894 [45] [22]
1895 [46] [22]
1896 [46] [23]
1897 [46] [23]
1898 [47] [24]
1899 [47] [25]
1900 [49] [25]
1901 [49] [25]
1902 [49] [26]
1903 [49] [27]
1904 [50] [28]
1905 [50] [28]
1906 [49] [28]
1907 [50] [30]
1908 [49] [30]
1909 [49] [30]
... ... ...
1985 [72] [36]
1986 [74] [38]
1987 [75] [39]
1988 [78] [40]
1989 [83] [43]
1990 [90] [45]
1991 [95] [48]
1992 [102] [51]
1993 [107] [54]
1994 [112] [57]
1995 [115] [60]
1996 [122] [64]
1997 [129] [67]
1998 [138] [70]
1999 [146] [73]
2000 [155] [77]
2001 [165] [81]
2002 [170] [83]
2003 [179] [87]
2004 [191] [92]
2005 [199] [96]
2006 [209] [99]
2007 [223] [103]
2008 [234] [109]
2009 [241] [114]
2010 [246] [117]
2011 [244] [120]
2012 [248] [124]
2013 [241] [126]
2014 [483] [262]

135 rows × 2 columns


In [80]:
diversity[['F', 'M']] = diversity[['F', 'M']].astype(int)
diversity.dtypes

diversity.plot(title = 'Number of popular names in top 50%')


Out[80]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f08aa19a950>

Revolution "the last letter"


In [81]:
get_last_letter = lambda x: x[-1]
last_letters = names.name.map(get_last_letter)
last_letters.name = 'last_letter'

table = names.pivot_table('births', index=last_letters, columns=['sex', 'year'], aggfunc=sum)

In [83]:
subtable = table.reindex(columns=[1910, 1960, 2010], level='year')

In [84]:
subtable.head()


Out[84]:
sex F M
year 1910 1960 2010 1910 1960 2010
last_letter
a 108398.0 691271.0 676151.0 977.0 5212.0 28837.0
b NaN 694.0 454.0 411.0 3912.0 39229.0
c 5.0 49.0 954.0 482.0 15463.0 23325.0
d 6751.0 3728.0 2635.0 22113.0 262168.0 44780.0
e 133601.0 435056.0 316425.0 28665.0 178817.0 130130.0

In [85]:
subtable.sum()


Out[85]:
sex  year
F    1910     396503.0
     1960    2022121.0
     2010    1773440.0
M    1910     194216.0
     1960    2132756.0
     2010    1914629.0
dtype: float64

In [86]:
letter_prop = subtable / subtable.sum().astype(float)

In [87]:
fig, axes = plt.subplots(2, 1, figsize=(10, 8))
letter_prop['M'].plot(kind='bar', rot=0, ax=axes[0], title='Male')
letter_prop['F'].plot(kind='bar', rot=0, ax=axes[1], title='Female', legend=False)


Out[87]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f08a9e0a110>

In [88]:
letter_prop = table / table.sum().astype(float)

In [89]:
dny_ts = letter_prop.ix[['d', 'n', 'y'], 'M'].T

In [90]:
dny_ts.head()


Out[90]:
last_letter d n y
year
1880 0.083057 0.153217 0.075763
1881 0.083242 0.153212 0.077455
1882 0.085332 0.149561 0.077538
1883 0.084051 0.151653 0.079148
1884 0.086121 0.149926 0.080407

In [91]:
dny_ts.plot()


Out[91]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f08a996ba50>

Men's names have become women and vice versa


In [92]:
all_names = top1000.name.unique()

In [93]:
mask = np.array(['lesl' in x.lower() for x in all_names])

In [94]:
lesley_like = all_names[mask]

In [97]:
np.array(['Leslie', 'Lesley', 'Leslee', 'Lesli', 'Lesly'], dtype=object)


Out[97]:
array(['Leslie', 'Lesley', 'Leslee', 'Lesli', 'Lesly'], dtype=object)

In [98]:
filtered = top1000[top1000.name.isin(lesley_like)]

In [100]:
filtered.groupby('name').births.sum()


Out[100]:
name
Leslee       993
Lesley     35032
Lesli        929
Leslie    376158
Lesly      11155
Name: births, dtype: int64

In [101]:
table = filtered.pivot_table('births', index='year', columns='sex', aggfunc='sum')

In [102]:
table = table.div(table.sum(1), axis=0)

In [103]:
table.tail()


Out[103]:
sex F M
year
2010 1.0 NaN
2011 1.0 NaN
2012 1.0 NaN
2013 1.0 NaN
2014 1.0 NaN

In [104]:
table.plot(style={'M': 'k-', 'F': 'k--'})


Out[104]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f08a9845790>

In [ ]: